package org.example.market.service;

import org.example.market.util.Result;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.UUID;

/**
 * 文件上传服务类
 * 负责处理文件上传逻辑，包括目录创建、文件名处理、文件保存等操作
 */
@Service
public class FileUploadService {

    /**
     * 文件上传的根目录
     * 使用相对路径"upload-dir"，实际会存储在项目运行目录下的该文件夹中
     */
    private final Path rootLocation = Paths.get("upload-dir");

    /**
     * 处理文件上传
     * @param file 前端上传的文件（MultipartFile类型）
     * @return 上传结果：成功返回生成的唯一文件名，失败返回错误信息
     */
    public Result<String> uploadFile(MultipartFile file) {
        try {
            // 校验文件是否为空
            if (file.isEmpty()) {
                return Result.error(400, "文件为空");
            }

            // 若上传目录不存在，则创建目录（包括多级目录）
            if (!Files.exists(rootLocation)) {
                Files.createDirectories(rootLocation);
            }

            // 生成唯一文件名，避免文件名重复覆盖
            // 1. 获取原始文件名
            String originalFilename = file.getOriginalFilename();
            // 2. 提取文件扩展名（如.jpg、.pdf）
            String fileExtension = null;
            if (originalFilename != null) {
                fileExtension = originalFilename.substring(originalFilename.lastIndexOf("."));
            }
            // 3. 生成UUID作为新文件名，拼接扩展名
            String newFilename = UUID.randomUUID().toString() + fileExtension;

            // 构建文件保存路径
            // normalize()：规范化路径，处理路径中的"."和".."
            // toAbsolutePath()：转换为绝对路径，确保路径唯一性
            Path destinationFile = rootLocation.resolve(Paths.get(newFilename))
                    .normalize().toAbsolutePath();

            // 将上传的文件输入流复制到目标路径，完成文件保存
            Files.copy(file.getInputStream(), destinationFile);

            // 上传成功，返回生成的唯一文件名（可用于后续文件访问）
            return Result.success(newFilename);
        } catch (IOException e) {
            // 捕获IO异常，返回错误信息
            return Result.error(500, "文件上传失败: " + e.getMessage());
        }
    }
}